const {
	findUser
} = require('../../lib/utils/account')
const {
	ERROR
} = require('../../common/error')
const {
	userCollection
} = require('../../common/constants')
const PasswordUtils = require('../../lib/utils/password')

/**
 * 新增用户
 * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#add-user
 * @param {Object}  params
 * @param {String}  params.username       用户名
 * @param {String}  params.password       密码
 * @param {String}  params.nickname       昵称
 * @param {Array}   params.authorizedApp  允许登录的AppID列表
 * @param {Array}   params.role           用户角色列表
 * @param {String}  params.mobile         手机号
 * @param {String}  params.email          邮箱
 * @param {Array}   params.tags           用户标签
 * @param {Number}  params.height         用户身高
 * @param {Number}  params.weight         用户体重
 * @param {Number}  params.number         用户执行次数
 * @param {Number}  params.price         用户执行次数
 * @param {Array}  params.image         用户封面图片
 * @param {Array}  params.video         用户视频
 * @param {String}  params.synopsis         用户简介
 * @returns
 */
module.exports = async function(params = {}) {
	const schema = {
		username: 'username',
		password: 'password',
		authorizedApp: {
			required: false,
			type: 'array<string>'
		}, // 指定允许登录的app，传空数组或不传时表示可以不可以在任何端登录
		sort:{
			required: false,
			type:"number",
		},
		gender:{
			required: false,
			type:"number",
		},
		nickname: {
			required: false,
			type: 'nickname'
		},
		role: {
			require: false,
			type: 'array<string>'
		},
		mobile: {
			required: false,
			type: 'mobile'
		},
		email: {
			required: false,
			type: 'email'
		},
		tags: {
			required: false,
			type: 'array<string>'
		},
		status: {
			required: false,
			type: 'number'
		},
		weight: {
			required: false,
			type: 'string'
		},
		height: {
			required: false,
			type: 'string'
		},
		number:{
			required: false,
			type: 'string'
		},
		price:{
			required: false,
			type: 'number'
		},
		headerImage:{
			require: false,
			type: 'array'
		},
		image:{
			require: false,
			type: 'array'
		},
		video:{
			require: false,
			type: 'array'
		},
		synopsis:{
			require: false,
			type: 'string'
		}
	}
	this.middleware.validate(params, schema)

	const {
		sort,
		gender,
		username,
		password,
		authorizedApp,
		nickname,
		role,
		mobile,
		email,
		tags,
		status,
		weight,
		height,
		number,
		price,
		headerImage,
		image,
		video,
		synopsis
	} = params
	const {
		userMatched
	} = await findUser({
		userQuery: {
			username,
			mobile,
			email
		},
		authorizedApp
	})
	if (userMatched.length) {
		throw {
			errCode: ERROR.ACCOUNT_EXISTS
		}
	}
	const passwordUtils = new PasswordUtils({
		clientInfo: this.getUniversalClientInfo(),
		passwordSecret: this.config.passwordSecret
	})
	const {
		passwordHash,
		version
	} = passwordUtils.generatePasswordHash({
		password
	})
	const data = {
		sort,
		gender,
		username,
		password: passwordHash,
		password_secret_version: version,
		dcloud_appid: authorizedApp || [],
		nickname,
		role: role || [],
		mobile,
		email,
		tags: tags || [],
		status,
		weight,
		height,
		number,
		price,
		headerImage,
		image,
		video,
		synopsis
	}
	if (email) {
		data.email_confirmed = 1
	}
	if (mobile) {
		data.mobile_confirmed = 1
	}

	// 触发 beforeRegister 钩子
	const beforeRegister = this.hooks.beforeRegister
	let userRecord = data
	if (beforeRegister) {
		userRecord = await beforeRegister({
			userRecord,
			clientInfo: this.getUniversalClientInfo()
		})
	}
    console.log(userRecord)
	await userCollection.add(userRecord)
	return {
		errCode: 0,
		errMsg: ''
	}
}